package com.secxiot.provider.narcotic.service;

import com.secxiot.common.entity.ResultVo;
import com.secxiot.provider.narcotic.dto.NarcoticPatientDrugsRecordDto;
import com.secxiot.provider.narcotic.entity.NarcoticDocDo;
import com.secxiot.provider.narcotic.entity.NarcoticPatientDrugsRecordDo;
import com.secxiot.provider.narcotic.entity.NarcoticPatientInfoDo;
import com.secxiot.provider.narcotic.entity.TakeDestroyDo;
import com.secxiot.provider.narcotic.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Date;
import java.util.List;

public interface NarcoticService {
    /**
     * 查询医药须知
     *
     * @param hospitalId 医疗机构ID
     * @param type       类型
     * @return 医药须知
     */
    NarcoticDocDo selectNarcoticDoc(Long hospitalId, String type);

    /**
     * 查询药品类型
     *
     * @param hospitalId 医疗机构ID
     * @return 医药须知
     */
    List<NarcoticDrugsVo> selectNarcoticDrugs(Long hospitalId);

    /**
     * 查询药品类型
     *
     * @param drugsId 医药类型ID
     * @return 医药须知
     */
    NarcoticDrugsVo getNarcoticDrugsById(Long drugsId);

    /**
     * 查询用户资料信息-- 分页
     *
     * @param userId 用户ID
     * @return 用户资料信息
     */
    List<NarcoticPatientInfoVo> selectNarcoticPatientInfoPage(@Param("userId") Long userId, @Param(value = "pageNo") Integer pageNo,
                                                              @Param(value = "pageSize") Integer pageSize);

    /**
     * 查询用户资料信息
     *
     * @param userId 用户IDs
     * @return 用户资料信息s
     */
    List<NarcoticPatientInfoVo> selectNarcoticPatientInfoList(@Param("userId") Long userId);

    /**
     * 查询用户资料信息
     *
     * @param patientInfoId 用户资料信息id
     * @return 用户资料信息
     */
    NarcoticPatientInfoVo getNarcoticPatientInfoById(@Param("patientInfoId") Long patientInfoId);

    /**
     * 添加用户资料信息
     *
     * @param narcoticPatientInfoVo 资料对象信息
     * @return int
     */
    Long insertNarcoticPatientInfo(NarcoticPatientInfoVo narcoticPatientInfoVo);

    /**
     * 修改用户资料信息
     *
     * @param narcoticPatientInfoVo 资料对象信息
     * @return int
     */
    Long updateNarcoticPatientInfo(NarcoticPatientInfoVo narcoticPatientInfoVo);

    /**
     * 申请用药信息--列表
     *
     * @param userId     用户ID
     * @param pageNo     页数
     * @param pageSize   条数
     * @param isPage     是否分页  0 否  1 是
     * @param searchName 关键字
     * @return
     */
    List<NarcoticPatientDrugsRecordVo> selectNarcoticPatientDrugsRecord(@Param("userId") Long userId,
                                                                        @Param("pageNo") Integer pageNo,
                                                                        @Param("pageSize") Integer pageSize,
                                                                        @Param("isPage") Integer isPage,
                                                                        @Param("searchName") String searchName);

    /**
     * 添加用药记录
     *
     * @param narcoticDrugsRecordVo 用药记录对象
     * @return
     */
    Long insertNarcoticDrugsRecord(NarcoticPatientDrugsRecordVo narcoticDrugsRecordVo);

    /**
     * 修改用药记录
     *
     * @param narcoticDrugsRecordVo 用药记录对象
     * @return int
     */
    Long updateNarcoticDrugsRecord(NarcoticPatientDrugsRecordVo narcoticDrugsRecordVo);

    /**
     * 医生药品记录
     *
     * @param doctorRecordId 医生药品记录ID
     * @return 医生药品记录
     */
    NarcoticDoctorRecordVo getNarcoticDoctorRecordById(@Param("doctorRecordId") Long doctorRecordId);

    /**
     * 医生药品记录 列表
     *
     * @param doctorUserId 医生用户ID
     * @param hospitalId   医疗机构ID
     * @param pageNo       页数
     * @param pageSize     条数
     * @param isPage       是否分页  0 否  1 是
     * @param searchName   关键字
     * @return
     */
    List<NarcoticDoctorRecordVo> selectNarcoticDoctorRecordList(@Param("doctorUserId") Long doctorUserId,
                                                                @Param("hospitalId") Long hospitalId,
                                                                @Param("pageNo") Integer pageNo,
                                                                @Param("pageSize") Integer pageSize,
                                                                @Param("isPage") Integer isPage,
                                                                @Param("searchName") String searchName);

    /**
     * 审核 药品记录
     *
     * @param narcoticDoctorRecordVo
     * @return
     */
    ResultVo<NarcoticDoctorRecordVo> auditNarcoticDoctorRecord(NarcoticDoctorRecordVo narcoticDoctorRecordVo);

    /**
     * 药师药品记录
     *
     * @param chemistRecordId id
     * @return 药师药品记录
     */
    NarcoticChemistRecordVo getNarcoticChemistRecordById(@Param("chemistRecordId") Long chemistRecordId);

    /**
     * 药师药品记录 列表
     *
     * @param chemistUserId 药师用户ID
     * @param hospitalId    医疗机构ID
     * @param pageNo        页数
     * @param pageSize      条数
     * @param isPage        是否分页  0 否  1 是
     * @param searchName    关键字
     * @return
     */
    List<NarcoticChemistRecordVo> selectNarcoticChemistRecordList(@Param("chemistUserId") Long chemistUserId,
                                                                  @Param("hospitalId") Long hospitalId,
                                                                  @Param("pageNo") Integer pageNo,
                                                                  @Param("pageSize") Integer pageSize,
                                                                  @Param("isPage") Integer isPage,
                                                                  @Param("searchName") String searchName);

    /**
     * 审核 药师记录
     *
     * @param narcoticChemistRecordVo
     * @return
     */
    ResultVo<NarcoticChemistRecordVo> auditNarcoticChemistRecord(NarcoticChemistRecordVo narcoticChemistRecordVo);

    /**
     *  药师重置审核
     *
     * @param
     * @return
     */
    Long resetAuditNarcoticChemistRecord(Long chemistRecordId, Long chemistUserId);

    /**
     * 取药销毁记录 信息
     *
     * @param id 取药记录id
     * @return
     */
    NarcoticTakeDestroyVo getNarcoticTakeDestroyById(@Param("id") Long id);

    /**
     * 取药销毁记录 列表
     *
     * @param hospitalId 医疗机构ID
     * @param type       1 取药 2 销毁
     * @param pageNo     页数
     * @param pageSize   条数
     * @param isPage     是否分页  0 否  1 是
     * @param searchName 关键字
     * @return
     */
    List<NarcoticTakeDestroyVo> selectNarcoticTakeDestroy(@Param("hospitalId") Long hospitalId,
                                                          @Param("type") String type,
                                                          @Param("pageNo") Integer pageNo,
                                                          @Param("pageSize") Integer pageSize,
                                                          @Param("isPage") Integer isPage,
                                                          @Param("searchName") String searchName);

    /**
     *  患者取药
     * @param takeDestroyDo 取药入参
     * @return
     */
    ResultVo<NarcoticTakeDestroyVo> auditNarcoticTakeMedicine(TakeDestroyDo takeDestroyDo);

    /**
     * 销毁
     *
     * @param narcoticTakeDestroyVo
     * @return
     */
    ResultVo<NarcoticTakeDestroyVo> auditNarcoticDestroy(NarcoticTakeDestroyVo narcoticTakeDestroyVo);

    /**
     * 监管审核资料审核
     *
     * @param narcoticUserInfoVo
     * @return
     */
    ResultVo<NarcoticPatientInfoVo> auditNarcoticPatientInfo(NarcoticPatientInfoVo narcoticUserInfoVo);

    /**
     * 监管资料列表
     *
     * @param hospitalId 医疗机构ID
     * @param pageNo     页数
     * @param pageSize   条数
     * @param isPage     是否分页  0 否  1 是
     * @return 用户资料信息
     */
    List<NarcoticPatientInfoVo> selectNarcoticPatientInfoPageByHospital(@Param(value = "hospitalId") Long hospitalId,
                                                                        @Param(value = "pageNo") Integer pageNo,
                                                                        @Param(value = "pageSize") Integer pageSize,
                                                                        @Param(value = "isPage") Integer isPage,
                                                                        @Param(value = "searchName") String searchName);

    /**
     * 药品跟踪记录--详情
     *
     * @param patientDrugsRecordId 申请用药记录ID
     * @return NarcoticDrugsRecordDo
     */
    ResultVo<NarcoticPatientDrugsRecordDto> getNarcoticPatientDrugsRecordDtoById(@Param("patientDrugsRecordId") Long patientDrugsRecordId);

    /**
     * 药品厂家列表
     *
     * @param hospitalId 医院ID
     * @return
     */
    List<NarcoticDrugsFactoryVo> getNarcoticDrugsFactoryList(@RequestParam("hospitalId") Long hospitalId);

    /**
     * 扫码验证药品
     *
     * @param patientDrugsRecordId 申请用药记录Id
     * @param patientUserId        患者用户Id
     * @return
     */
    QRCodeProDrugsVo scanDrugsQRCode(@RequestParam("patientDrugsRecordId") Long patientDrugsRecordId,
                                     @RequestParam("patientUserId") Long patientUserId);

    /**
     * 获取药品统计数据
     *
     * @param userId   用户ID
     * @param dateTime 时间节点
     * @return
     */
    DrugsCountResultVo getDrugsCountResultVo(Long userId, Date dateTime);

    /**
     * 获取用户有效资料
     *
     * @param userId 用户Id
     */
    List<NarcoticPatientInfoVo> getPatientInfoByUserId(Long userId);

    /**
     * 获取用户未完成的用药申请列表
     *
     * @param userId 用户Id
     */
    List<NarcoticPatientDrugsRecordVo> getPatientDrugsRecordByUserId(Long userId);

    /**
     * 用户资料定时提醒
     */
    void timePatientInfoByUserId();

    /**
     * 用户申请定时过期
     */
    void timeUpdateDrugsRecordStatus();
}
